Θα ρίξω άλλη μία ματιά στην κρυστάλλινη σφαίρα μου και θα υποθέσω ότι έχεις ένα πίνακα με 3 στήλες και 100000 γραμμές τις οποίες θέλεις να εισάγεις στον SQL Server. Καταρχήν, πρέπει να καταλάβεις το εξής. Εκατό χιλιάδες inserts θα αργήσουν, ότι και να κάνεις, σε όποια βάση και να το κάνεις. Επιπλέον, είναι αρκετά σπάνιο να χρειάζεται να κάνεις εκατό χιλιάδες inserts με τη μία. Τόσα πολλά inserts θα δημιουργήσουν προβλήματα fragmentation και θα αντιμετωπίσουν καθυστερήσεις αν ο πίνακας έχει indexes. Επαναλαμβάνω, αυτό θα συμβεί σε οποιαδήποτε βάση. Κατά πάσα πιθανότητα υπάρχει άλλη λύση από τα 100000 inserts, αλλά μέχρι να μας εξηγήσεις ποιό είναι το πρόβλημα, δεν μπορούμε να σε βοηθήσουμε περισσότερο.
Ο τρόπος με τον οποίο γίνονται μαζικές εισαγωγές σε οποιαδήποτε βάση είναι το bulk insert. Η βάση δεδομένων διαβάζει τα δεδομένα όλα μαζί και τα γράφει στον πίνακα χωρίς να κρατάει εγγραφές στο transaction log για κάθε μία εγγραφή. Έτσι πετυχαίνεις αρκετά μεγαλύτερη ταχύτητα εισαγωγής. Bulk Insert μπορείς να πετύχεις με διάφορους τρόπους στον SQL Server. Καταρχήν, μπορείς να εισάγεις εγγραφές από ένα αρχείο με την εντολή ... BULK INSERT ή το bcp command line utility. Μπορείς επίσης να χρησιμοποιήσεις SSIS (integration services) και το Bulk Insert task.
Το ίδιο το ADO.NET 2+ περιέχει την κλάση SqlBulkCopy με την οποία μπορείς να στείλεις τα δεδομένα ενός DataTable, DataRow ή DataReader στη βάση μέσω του μηχανισμού bulk insert του SQL Server. Με αυτή την κλάση μπορείς να πετύχεις μέσω ADO.NET την ίδια περίπου απόδοση όπως με το bcp ή το BULK INSERT.
Θα επαναλάβω ότι πολύ σπάνια χρειάζεται να κάνει κάποιος bulk insert από τον client στον server. Συνήθως υπάρχουν πολύ καλύτερες εναλλακτικές. Αν, για παράδειγμα, θέλεις να κάνεις περίπλοκους υπολογισμούς μπορείς να φτιάξεις και να χρησιμοποιήσεις User Defined Types και Functions σε C# ή VB.NET και να τα χρησιμοποιήσεις από T-SQL. Έτσι θα κάνεις τους υπολογισμούς στον server και δεν θα χρειαστεί να μεταφέρεις τα δεδομένα στον client για επεξεργασία και να τα επιστρέψεις.
Για πες μας για ποιό λόγο θέλεις να μεταφέρεις τόσα δεδομένα, μήπως υπάρχει καλύτερη εναλλακτική
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos